#!/bin/bash

if [ `id -u` -ne 0 ]; then
    echo "El script debe ejecutarse con permisos de root"
    exit
fi

if [ "$1" = "" ]; then
    echo "Debe pasar un archivo como parametro"
    exit
fi

echo "Actualizando usuarios y grupos a partir de $1"

while read id tipo usuario grupo clave
do
    # me fijo si el tipo es U o G
    if [ "$tipo" = "U" ]; then
        echo "Buscando al usuario con id = $id ..."
        busquedaPorId=$(grep "x:$id" /etc/passwd)
        busquedaPorNombre=$(grep "$usuario:x" /etc/passwd)
        if [ "$busquedaPorId" != "" -a "$busquedaPorNombre" != "" -a "$busquedaPorId" != "$busquedaPorNombre" ]; then
            echo "ERROR: el id $id  y el nombre $usuario ya existen y corresponden a distintos usuarios, no se puede realizar ninguna accion"
	        exit
        fi
        if [ "$clave" = "" ]; then
            # en este caso la clave quedo guardada en grupo o ambos son ""
            clave="$grupo"
            grupo=""
        else
            # me pasan la clave y el grupo
            # si el grupo no existe lo creo
            g=$(grep "$grupo:x" /etc/group);
            if [ "$g"="" ]; then
                groupadd $grupo
            fi
        fi
        # ahora la clave y el grupo estan bien y el grupo está creado si no lo estaba
        if [ "$busquedaPorId" = "" -a "$busquedaPorNombre" = "" ]; then
            # tengo que crear el usuario porque no existe
            useradd $usuario -u $id -g $grupo -m
            # y ponerle la clave, la cual supongo que no es nula en este caso
            (echo $clave; sleep 1; echo $clave) | passwd $usuario
	    else 
            if [ "$busquedaPorId" = "" ]; then
                # hay que modificar el id
                usermod -u $id
            fi
	        if [ "$busquedaPorNombre" = "" ]; then
                # hay que modificar el nombre del usuario y su directorio
                usermod -l $usuario -d /home/$usuario -m
            fi
            # cambio el password del usuario si clave no es nula
            if [ "$clave" != "" ]; then
                (echo $clave; sleep 1; echo $clave) | passwd $usuario
            else
                echo "No se paso ninguna clave para $usuario, su password no va a ser modificado"
            fi
            # si el grupo no es nulo lo cambio
            if [ "$grupo" != "" ]; then
                usermod -g $grupo
            fi
	    fi
    else 
        if [ "$tipo" = "G" ]; then
            echo "Buscando al usuario con id = $id ..."
            busquedaPorId=$(grep "x:$id" /etc/group)
            busquedaPorNombre=$(grep "$grupo:x" /etc/group)
            if [ "$busquedaPorId" != "" -a "$busquedaPorNombre" != "" -a "$busquedaPorId" != "$busquedaPorNombre" ]; then
                echo "ERROR: el id $id  y el nombre $usuario ya existen y corresponden a distintos grupos, no se puede realizar ninguna accion"
            	exit
            fi
            # en este caso clave siempre va a estar vacio porque el nombre del grupo va en usuario
            # y si hay una clave queda guardada en grupo, asi que lo intercambio para que quede mas claro
            clave="$grupo"
            grupo="$usuario"
            usuario=""
            if [ "$busquedaPorId" = "" -a "$busquedaPorNombre" = "" ]; then
                # tengo que crear el grupo porque no existe
                groupadd -g $id $grupo
                # y ponerle la clave, la cual supongo que no es nula en este caso
                (echo $clave; sleep 1; echo $clave) | passwd -g $grupo
	        else 
                oldGName=""
                if [  "$busquedaPorId" != "" ]; then
                    a=`expr index "$busquedaPorId" :`
                    $oldGName=${busquedaPorId:0:$a}
                fi
                if [  "$busquedaPorNombre" != "" ]; then
                    oldGName=$grupo
                fi                

                if [ "$busquedaPorId" = ""]; then
                    # hay que modificar el id
                    groupmod -g $id $oldGName
                fi

	            if [ "$busquedaPorNombre" = "" ]; then
                    # hay que modificar el nombre del grupo
                    groupmod -n $grupo $oldGName
                    oldGName=$grupo
                fi
                # cambio el password del grupo si clave no es nula
                if [ "$clave" != "" ]; then
                    (echo $clave; sleep 1; echo $clave) | passwd -g $oldGName
                else
                    echo "No se paso ninguna clave para $grupo, su password no va a ser modificado"
                fi
	        fi
        else
            echo "ERROR: el tipo no es ni U ni G"
            exit
        fi    
    fi
    
done < $1  # se lee del archivo pasado como parametro

